#include <stdlib.h>
#include <stdio.h>

struct LinkedList{
    int data;
    struct LinkedList *next;
};

void Insert_At_Beginning(struct LinkedList** head); // double pointeris, nes reikia susigrazinti nusiusta reiksme
void Insert_At_End(struct LinkedList** head);
void Delete_First(struct LinkedList** head);
void Delete_Last(struct LinkedList** head);
void Print_List(struct LinkedList* head);
void End(struct LinkedList** head);

int main(){   // Atliekamas valdymas
    struct LinkedList* head = NULL;
    int number;
int bb;
    printf("----------------------------------------------\n");
    printf("1 - Iterpti elementa i saraso pradzia. \n");
    printf("2 - Iterpti elementa i saraso pabaiga. \n");
    printf("3 - Pasalinti elementa is saraso pradzios. \n");
    printf("4 - Pasalinti elementa is saraso pabaigos. \n");
    printf("5 - Atspausdinti visus saraso elementus. \n");
    printf("6 - Baigti programos darba. \n");

    printf("----------------------------------------------\n");

    while(1){
        printf("Ivesk 1-6 \n");
        scanf("%d", &number);
        switch(number){
        case 1 :
            Insert_At_Beginning(&head);
            break;
        case 2 :
            Insert_At_End(&head);
            break;
        case 3 :
            Delete_First(&head);
            break;
        case 4 :
            Delete_Last(&head);
            break;
        case 5 :
            Print_List(head);
            break;
        case 6 :
            End(&head);
			break;
		case 7 :
		//	int bb;
			printf("kiek pridet? \n");
			scanf("%bb",&bb);
			int i;
			for(i=0; i<bb;i++){
            Insert_At_End(&head);}
            break;
        default :
            printf("Ivestas neteisingas skaicius, tokios proceduros nera! \n");
        }
    }
    return 0;
}

void Insert_At_Beginning(struct LinkedList** head){
    int number;
    struct LinkedList* link = (struct LinkedList*)malloc(sizeof(struct LinkedList));

    printf("Iveskite elementa: \n");
    scanf("%d", &number);

    link->data = number;
    link->next = (*head);
    (*head) = link;

}

void Insert_At_End(struct LinkedList** head){
    int number;
    struct LinkedList* link = (struct LinkedList*)malloc(sizeof(struct LinkedList));
    struct LinkedList* ptr = (*head);

    printf("Iveskite elementa: \n");
    scanf("%d", &number);

    while(ptr->next != NULL){  // einam iki saraso galo
        ptr = ptr->next;
    }
    link->data = number;
    link->next = ptr->next;
    ptr->next = link;
}

void Delete_First(struct LinkedList** head){
    struct LinkedList* ptr = (*head);
    if(ptr == NULL){
        printf("Sarasas jau yra tuscias, nera ko istrinti. \n");
        return;
    }
    (*head) = ptr->next;
    free(ptr);
}

void Delete_Last(struct LinkedList** head){
    struct LinkedList* ptr = (*head);
    struct LinkedList* temp =(*head);
    if(ptr == NULL){
        printf("Sarasas jau yra tuscias, nera ko istrinti. \n");
        return;
    }
    if(ptr->next == NULL){
        (*head) = NULL;
    }
    while(ptr->next != NULL){  // einam iki saraso galo
        temp = ptr;
        ptr = ptr->next;
    }
    free(temp->next);
    temp->next = NULL;
}

void Print_List(struct LinkedList* head){
    struct LinkedList* ptr = head;
    printf("Saraso elementai: ");
    if(ptr == NULL){
        printf("Sarasas yra tuscias, nera ko spausdinti. \n");
        return;
    }
    while(ptr != NULL){
        printf(" %d ", ptr->data);
        ptr = ptr->next;
    }
    printf("\n");

}

void End(struct LinkedList** head){   // funkcija skirta baigti darbui
    struct LinkedList* ptr = (*head);
    struct LinkedList* temp = ptr;

    if((*head) == NULL){  // jei nera saraso griztam
        return;
    }
    while(ptr->next != NULL){  // einam per sarasa ir valom ji
        ptr = ptr->next;
        free(temp);
        temp = ptr;
    }
    (*head) = NULL;
}
